/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.ipartek.formacion.raul.factoria;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import com.ipartek.formacion.raul.dao.MySqlPersonaDAO;
import com.ipartek.formacion.raul.interfaces.InterfacePersonaDAO;

/**
 * 
 * @author Curso
 */
public class MySqlDAOFactory extends AbstractDAOFactory {

    // Conexion
    /** Cadena que contiene el driver de la BD. */
    private static final String DRIVER_MYSQL = "com.mysql.jdbc.Driver";
    /** Cadena que contiene el puerto a la BD. */
    private static String dbPort = "3306";
    /** Cadena que contiene el nombre de la BD. */
    private static String dbName;
    /** Cadena que contiene el nombre de usuario para conectarse a la BD. */
    private static String dbUser;
    /** Cadena que contiene el nombre de usuario para conectarse a la BD. */
    private static String dbPass;
    /**
     * Cadena que contiene el nombre o IP del servidor en donde esta alojada la
     * BD.
     */
    private static String dbServer;
    /** Cadena de conexion a la BD. */
    private static String dbUrl;
    /** Objeto de los Logs. */
    private static final Logger LOG = Logger.getLogger(MySqlDAOFactory.class);;

    // Constructor
    // ************************************************************************
    /** Constructor de la clase. */
    public MySqlDAOFactory() {
        Properties prop = new Properties();
        // StringBuffer sql = null;
        String rutaConfig = "config/configuracion.properties";
        PropertyConfigurator.configure("config/log4j.properties");

        try {
            FileInputStream fis = new FileInputStream(rutaConfig);
            prop.load(fis);

            dbName = prop.getProperty("database");
            dbUser = prop.getProperty("dbuser");
            dbPass = prop.getProperty("dbpass");
            dbServer = prop.getProperty("dbserver");
            dbPort = prop.getProperty("dbport");

        } catch (FileNotFoundException e) {
            LOG.error("FileNotFoundException " + e.getMessage());
        } catch (IOException e) {
            LOG.error("IOException " + e.getMessage());
        } catch (Exception e) {
            LOG.error("Exception " + e.getMessage());
        }
    }

    // Metodos
    // ************************************************************************

    // CONECTAR Y DESCONECTAR

    // Conectar con la base de datos
    /**
     * Funcion que gestiona las conexiones de la aplicacion.
     * 
     * @return Retorna el objeto de tipo conexion.
     * @throws Exception
     *             Excepcion a la hora de realizar la conexion.
     */
    public static Connection conectar() throws Exception {
        Connection conexion = null; // Creamos un tipo connection
        try {

            Class.forName(DRIVER_MYSQL);
            dbUrl = "jdbc:mysql://" + dbServer + ":" + dbPort + "/" + dbName;
            conexion = DriverManager.getConnection(dbUrl, dbUser, dbPass);

            conexion.setAutoCommit(false);

        } catch (Exception e) {
            LOG.error("Exception " + e.getMessage());
        }
        if (conexion == null) {
            throw new Exception("Problema al conectar BBDD conexion="
                    + conexion);
        }
        return conexion;
    }

    // Desconectar con la base de datos
    /**
     * Gestiona las desconexiones a la BD.
     * 
     * @param conexion
     */
    public static void desconectar(final Connection conexion) {
        if (conexion != null) {
            try {
                conexion.close();
            } catch (SQLException e) {
                while (e != null) {
                    LOG.error("Message: " + e.getMessage() + "SQLState: "
                            + e.getSQLState() + "ErrorCode: "
                            + e.getErrorCode());
                    e = e.getNextException();
                }
            }
        }
    }

    // Metodos que hay que implementar al extender de DAOFActory
    // *************************************************************************
    @Override
    public InterfacePersonaDAO getInterfacePersonaDAO() {
        return new MySqlPersonaDAO();
    }
}
